-
Notifications
You must be signed in to change notification settings - Fork 0
build: configure pytest-django and add dev dependencies #40
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: dev
Are you sure you want to change the base?
Conversation
A-lexisL
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- tests should be comprehensive, so more tests are needed. Please arrange them into classes based on API and Authenticated status.
e.g.
class TestCourseListAuthenticated
class TestCourseListNotAuthenticated
class TestCourseDetailAuthenticated
...
apps/web/tests/test_auth.py
Outdated
| response = base_client.get(url) | ||
| assert response.status_code == 200 | ||
| # Should be at least 1 due to the 'review' fixture | ||
| assert response.data["review_count"] >= 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test should be precise, so use ==1 instead of >=1
apps/web/tests/test_course.py
Outdated
| response = base_client.get(url) | ||
|
|
||
| assert response.status_code == 200 | ||
| assert response.data["count"] >= 3 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as above
apps/web/tests/test_course.py
Outdated
| # Check that filtering worked (only 1 course returned) | ||
| assert response.data["count"] == 1 | ||
|
|
||
| # FIX: Check course_code instead of department key |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know that you are making adjustments during developments. But comments are for reviewers and future maintainers, so the Fix: xxx here becomes confusing
| assert "results" in response.data | ||
|
|
||
| def test_filter_courses_by_department(self, base_client, course_factory): | ||
| """Verify filtering courses by department code.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For now, only filter courses by department code for nonauthenticated user exists. But tests for all the following params are needed for authenticated/nonauthenticated users.
- department (string): Filter by department code (case-insensitive)
- code (string): Filter by course code (partial match)
- min_quality (integer): Filter by minimum quality score (authenticated only)
- min_difficulty (integer): Filter by minimum difficulty score (authenticated only)
- sort_by (string): Sort field ("course_code", "review_count"),("quality_score", "difficulty_score")(authenticated only)
- sort_order (string): "asc" or "desc" (default: "asc")
- page (integer): Page number for pagination
(docstring of CoursesListAPI in apps/web/views.py)
Same for other apis
apps/web/tests/factories.py
Outdated
| @factory.lazy_attribute | ||
| def course_code(self): | ||
| """Generates unique MATH100, PHYS101, etc.""" | ||
| return f"{self.department}{self.number}" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
course_code is department+4-digit number+J, e.g. CHEM2110J
| @pytest.fixture | ||
| def course_factory(db): | ||
| """Fixture to access the factory class directly for batch creation""" | ||
| return factories.CourseFactory |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since more tests are needed, if the same group of db instances are used repeatedly, could consider wrap them up in fixture. e.g.
@pytest.fixture
def course(db):
return factories.CourseFactory()
@pytest.fixture
def course_batch(db):
return factories.CourseFactory.create_batch(3)
@pytest.fixture
def department_mixed_courses(db):
courses = [
CourseFactory(department="MATH", course_title="Honors Calculus II",course_code="MATH1560J"),
CourseFactory(department="MATH", course_title="Calculus II",course_code="MATH1160J"),
CourseFactory(department="CHEM", course_title="Chemistry",course_code="CHEM2100J"),
# and more
]
return courses
apps/web/tests/test_review.py
Outdated
| class TestReviewManagement: | ||
| """ | ||
| Tests for Review management: | ||
| - Creation with validation (30+ chars, valid term) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
30 is not a fixed number but varies according to configs.
Its best to generate comments based on settings.WEB["REVIEW"]["COMMENT_MIN_LENGTH"] (since the content of comments is not important, could use python internal string manipulation methods or faker to generate comments of desired length instead of writing them manually)
apps/web/tests/test_review.py
Outdated
| url = reverse("user_review_api", kwargs={"review_id": review.id}) | ||
| response = auth_client.delete(url) | ||
| assert response.status_code == 204 | ||
| assert Review.objects.filter(id=review.id).count() == 0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing tests for base_client
|
|
||
| # Should be 400 according to standard API validation rules | ||
| assert response.status_code == 400 | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing canceling vote/changing vote/vote for difficulty.. tests
|
|
||
| assert response.status_code == 200 | ||
| # Verify the title matches the fixture-created course | ||
| assert response.data["course_title"] == course.course_title |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
base_client and auth_client will receive different response data:
- auth_client: full details
- base_client:
"quality_score" ,"difficulty_score","difficulty_vote","quality_vote","quality_vote_count","difficulty_vote_count"fields are removed(the docstrings for CoursesDetailAPI is not complete)
…fix the format of the course code later
d40df23 to
bc0334e
Compare
…sc and desc) pagnition)
…eview into feat/web-view-pytest
No description provided.